import { FieldNamesProps } from "@/components/ProTable/interface";
import { isArray } from "./is";

/**
 * @description: 处理无数据情况
 * @param {any} callValue 需要处理的值
 * @return {*}
 */
export function formatValue(callValue: any) {
	// 如果当前值为数组，使用  / 拼接（根据需求自定义）
	if (isArray(callValue)) return callValue.length ? callValue.join("/") : "--";
	return callValue ?? "--";
}

/**
 * @description: 处理 prop 为多级嵌套的情况，返回的数据（例如： prop:user.name）
 * @param {object} row 当前行数据
 * @param {string} prop 当前 prop
 * @return {*}
 */
export function handleRowAccordingToProp(row: { [key: string]: any }, prop: string) {
	// console.log("row: ", row, prop);
	if (!prop.includes(".")) return row[prop] ?? "--";
	console.log("走这里吗");
	prop.split(".").forEach(item => (row = row[item] ?? "--"));

	return row;
}

/**
 * @description: 处理prop，当prop为多级嵌套时，返回最后一级prop进行渲染
 * @param {string} prop 当前prop
 * @return {*}
 */
export function handleProp(prop: string) {
	const propArr = prop.split(".");
	if (propArr.length == 1) return prop;
	return propArr[propArr.length - 1];
}

/**
 * @description 获取浏览器默认语言
 * @returns {String}
 */
export function getBrowserLang() {
	let browserLang = navigator.language ? navigator.language : navigator.browserLanguage;
	let defaultBrowserLang = "";
	if (["cn", "zh", "zh-cn"].includes(browserLang.toLowerCase())) {
		defaultBrowserLang = "zh";
	} else {
		defaultBrowserLang = "en";
	}
	return defaultBrowserLang;
}

/**
 * @description 根据枚举列表查询当需要的数据（如果指定了 label 和 value 的 key值，会自动识别格式化）
 * @param {String} callValue 当前单元格值
 * @param {Array} enumData 字典列表
 * @param {Array} fieldNames label && value && children 的 key 值
 * @param {String} type 过滤类型（目前只有 tag）
 * @returns {String}
 * */
export function filterEnum(callValue: any, enumData?: any, fieldNames?: FieldNamesProps, type?: "tag") {
	const value = fieldNames?.value ?? "value";
	const label = fieldNames?.label ?? "label";
	const children = fieldNames?.children ?? "children";
	let filterData: { [key: string]: any } = {};
	// 判断 enumData 是否为数组
	if (Array.isArray(enumData)) filterData = findItemNested(enumData, callValue, value, children);

	// 判断是否输出的结果为 tag 类型
	if (type == "tag") {
		return filterData?.tagType ? filterData.tagType : "";
	} else {
		return filterData ? filterData[label] : "--";
	}
}

/**
 * @description 递归查找 callValue 对应的 enum 值
 * */
export function findItemNested(enumData: any, callValue: any, value: string, children: string) {
	return enumData.reduce((accumulator: any, current: any) => {
		if (accumulator) return accumulator;
		if (current[value] === callValue) return current;
		if (current[children]) return findItemNested(current[children], callValue, value, children);
	}, null);
}
